package com.soulgame.sms.common;

import java.io.InputStream;

import android.content.Context;

import com.soul.sdk.SGProxy;
import com.soul.sdk.constants.Constants;
import com.soul.sdk.utils.OperatorUtils;
import com.soul.sdk.utils.SGDebug;
import com.soul.sdk.utils.json.KJSONObject;
import com.soul.sdk.vo.VoSdkServerConfig;
import com.soulgame.sms.contant.PayType;
import com.soulgame.sms.pay.MMPay;

/**
 * @author lch
 * @version Create time：2017-3-21
 * @类说明：支付类型配置管理类
 */
public class PayTypeConfig {

	private static PayTypeConfig mPayTypeConfig;

	private Context mContext;

	private KJSONObject mPayTypeKJSONObject;
	// 获取运营商 :Mobile/Unicom/Telecom/unknown
	private String mOperator;

	private PayTypeConfig(Context pContext) {
		this.mContext = pContext;
		this.mPayTypeKJSONObject = this.loadPayTypeConfig(pContext);
		this.mOperator = OperatorUtils.getOperator(mContext);
	}

	public static PayTypeConfig getInstance(Context pContext) {
		if (mPayTypeConfig == null) {

			synchronized (PayTypeConfig.class) {
				mPayTypeConfig = new PayTypeConfig(pContext);
			}
		}

		return mPayTypeConfig;
	}

	/**
	 * 加载支付类型配置信息，获取到当前接入了哪些短代SDK
	 * 
	 * @return
	 */
	private KJSONObject loadPayTypeConfig(Context pContext) {
		KJSONObject mJSONObject = null;
		InputStream is = null;
		try {
			is = pContext.getAssets().open(Constants.PATH_SG_PAY_TYPE_CONFIG);
			int size = is.available();
			byte[] buffer = new byte[size];
			is.read(buffer);
			is.close();
			String aPayTypeConfigStr = new String(buffer, "utf-8");
			//
			SGDebug.v(Constants.PATH_SG_PAY_TYPE_CONFIG + ">>>" + aPayTypeConfigStr);
			//
			if (aPayTypeConfigStr != null) {
				mJSONObject = KJSONObject.createJsonObject(aPayTypeConfigStr);
			}

			if (SGDebug.isDebug() && mJSONObject != null) {
				SGDebug.d("mJSONObject" + ">>>" + mJSONObject.toString());
			}

		} catch (Exception e) {
			SGDebug.print_w(this, e.toString());
		}

		return mJSONObject;
	}

	/**
	 * 获取当前支付的类型 根据实际情况判定使用哪种支付,
	 * 
	 * 移动卡返回移动支付，联通返回联通支付，电信返回电信支付。
	 * 
	 * @return
	 */
	public String getPayType() {
		String mPayType = null;
		if (OperatorUtils.OPERATOR_MOBILE.equals(mOperator)) {
			// 移动卡
			if (isSupportPayType(PayType.MIGU) && isSupportPayType(PayType.MM)) {
				mPayType = PayType.MM;
				VoSdkServerConfig aVoServerConfig = SGProxy.getInstance().getVoSdkServerConfig(mContext);
				// 同时支持 咪咕 跟 MM 的情况，根据优先情况选择
				if (aVoServerConfig != null) {
					String ydPayType = aVoServerConfig.getnChangeYd();
					if ("mm".equalsIgnoreCase(ydPayType)) {
						mPayType = PayType.MM;
					} else if ("jd".equalsIgnoreCase(ydPayType)) {
						mPayType = PayType.MIGU;
					}
				}
				//
				if(!MMPay.isInitFinish){
					SGDebug.print_w(this, "MM init Fail，use migu !");
					mPayType = PayType.MIGU;
				}

			} else if (isSupportPayType(PayType.MIGU)) {
				// 只有咪咕的情况
				mPayType = PayType.MIGU;
			} else if (isSupportPayType(PayType.MM)) {
				// 只有MM的情况
				mPayType = PayType.MM;
			}

		} else if (OperatorUtils.OPERATOR_UNICOM.equals(mOperator)) {
			// 联通卡
			if (isSupportPayType(PayType.WOSHOP)) {
				mPayType = PayType.WOSHOP;
			}
		} else if (OperatorUtils.OPERATOR_TELECOM.equals(mOperator)) {
			// 电信卡
			if (isSupportPayType(PayType.EGAME) && isSupportPayType(PayType.ADM)) {
				// 同时支持 爱游戏 跟 爱动漫 的情况，根据优先情况选择
				mPayType = PayType.EGAME;
				VoSdkServerConfig aVoServerConfig = SGProxy.getInstance().getVoSdkServerConfig(mContext);
				if (aVoServerConfig != null) {
					String dxPayType = aVoServerConfig.getnChangeDx();
					if ("ayx".equalsIgnoreCase(dxPayType)) {
						mPayType = PayType.EGAME;
					} else if ("adm".equalsIgnoreCase(dxPayType)) {
						mPayType = PayType.ADM;
					}
				}
				
			} else if (isSupportPayType(PayType.EGAME)) {
				// 只有爱游戏的情况
				mPayType = PayType.EGAME;
			} else if (isSupportPayType(PayType.ADM)) {
				// 只有爱动漫的情况
				mPayType = PayType.ADM;
			}
		}

		return mPayType;
	}

	/**
	 * 是否支持指定的支付方式(指会进行初始化，可以调用支付的情况;因为有些时候可能会根据手机卡判断，比如在联通卡里 不进行咪咕初始化) 若需要的是
	 * 包含所有接入的情况请参考：{@link #isExistPayType(String)}
	 * 
	 * 移动卡返回移动支付，联通返回联通支付，电信返回电信支付。
	 * 
	 * @param pPayType
	 * @return
	 */
	public boolean isSupportPayType(String pPayType) {

		if (this.isExistPayType(pPayType)) {// 首先是已经接入了的支付方式
			if (OperatorUtils.OPERATOR_MOBILE.equals(mOperator)) {
				// 移动卡
				if (PayType.MIGU.equals(pPayType) || PayType.MM.equals(pPayType)) {
					return true;
				}
			} else if (OperatorUtils.OPERATOR_UNICOM.equals(mOperator)) {
				// 联通卡
				if (PayType.WOSHOP.equals(pPayType)) {
					return true;
				}
			} else if (OperatorUtils.OPERATOR_TELECOM.equals(mOperator)) {
				// 电信卡
				if (PayType.EGAME.equals(pPayType) || PayType.ADM.equals(pPayType)) {
					return true;
				}
			}

		}

		return false;
	}

	/**
	 * 工程是否接入了指定的支付方式(由配置文件获取)
	 * 
	 * @param pPayType
	 * @return
	 */
	public boolean isExistPayType(String pPayType) {
		if (mPayTypeKJSONObject != null) {

			boolean isEnable = mPayTypeKJSONObject.getBoolean(pPayType);
			return isEnable;
		}
		return false;
	}

	/**
	 * 获取配置的缺省时支付方式（当正常判断支付不存在的情况下用到，比如说无卡的情况、用户是电信卡，但是没有接入电信SDK的情况）
	 * 
	 * @return
	 */
	public String getDefaultPayType() {
		String defaultPayTytp = null;
		if (mPayTypeKJSONObject != null) {
			defaultPayTytp = mPayTypeKJSONObject.getString("default");
			if (!this.isExistPayType(defaultPayTytp)) {
				// 配置了默认值但是没有接入也没有用。
				defaultPayTytp = null;
			}
		}
		return defaultPayTytp;
	}
}
